// 新增用户

// 配置
const addConfig = {
  sql: `INSERT INTO users (userName, passWord) VALUES (?, ?)`,
  selectSql: `select (userName) from users where userName = ?`

}




exports.addUser = async function(req, res, next) {
  // 判空
  if( isEmpty(req.body) ) {
    return res.resend.sendJson(req, res,{
      status: 400,
      code: 'FAIL',
      data: {
        token: req.newToken
      },
      msg: '用户名或密码缺失'
    })
  }
  // 获取参数
  const {
    userName,
    passWord
  } = req.body;
  const connection = req.connection;
  // 检查用户名是否存在
  try {
    const isExist = await checkUserExist({
      userName,
      selectSql: addConfig.selectSql,
      connection
    });
    if(isExist) {
      return res.resend.sendJson(req, res,{
        status: 200,
        code: 'FAIL',
        data: {
          token: req.newToken
        },
        msg: '用户名已存在'
      })
    }
    // 添加用户
    const isAdd = await adduserToUsersTable({
      userName,
      passWord,
      addSql: addConfig.sql,
      connection
    });
    if( isAdd) {
      return res.resend.sendJson(req, res,{
        status: 200,
        code: 'SUCCESS',
        data: {
          token: req.newToken
        },
        msg: '添加用户成功'
      })
    }
    return res.resend.sendJson(req, res,{
      status: 200,
      code: 'FAIL',
      data: {
        token: req.newToken
      },
      msg: '添加用户失败'
    })
  }
  catch(err) {
    res.resend.sendJson(req, res,{
      status: 500,
      code: 'FAIL',
      data: '',
      msg: err.msg
    })
  }
}

/**
 * 向 users 表中添加新用户。
 * @param {Object} value - 包含用户名、密码和插入 SQL 语句的对象。
 * @param {string} value.userName - 要添加的用户名。
 * @param {string} value.passWord - 要添加的用户密码。
 * @param {string} value.addSql - 用于插入新用户的 SQL 语句。
 * @returns {Promise<boolean>} - 如果用户添加成功，返回一个解析为 true 的 Promise；否则返回一个解析为 false 的 Promise。
 */
function adduserToUsersTable(value) {
  const { userName, passWord, addSql, connection } = value;
  return new Promise( async(resolve, reject) => {
    try {
      const [row] =  await connection.query(addSql, [userName, passWord]);
      if(row.affectedRows > 0) {
        return resolve(true)
      }
      return resolve(false)
    }
    catch(err) {
      reject({
        error: err,
        msg: '添加新用户失败'
      })
    }
  })
}

/**
 * 检查用户名是否已经存在于数据库中。
 * @param {Object} value - 包含用户名和查询语句的对象。
 * @param {string} value.userName - 要检查的用户名。
 * @param {string} value.selectSql - 用于查询用户名是否存在的 SQL 语句。
 * @returns {Promise<boolean>} - 如果用户名存在，返回一个解析为 true 的 Promise；否则返回一个解析为 false 的 Promise。
 */
function checkUserExist( value) {
  const { userName, selectSql, connection } = value;
  return new Promise( async(resolve, reject) => {
    try {
      const [result] = await connection.query(selectSql, [userName]);
      if(result.length > 0) {
       return resolve(true)
      }
      return resolve(false)
    }catch(err) {
      reject({
        error: err,
        msg: '检测用户是否唯一查询失败'
      })
    }
  })
}




/**
 * 检查传入的参数对象中用户名和密码是否为空。
 * @param {Object} params - 包含用户名和密码的对象。
 * @param {string} params.userName - 要检查的用户名。
 * @param {string} params.passWord - 要检查的密码。
 * @returns {boolean} - 如果用户名和密码都不为空，返回 false；否则返回 true。
 */
function isEmpty(params) {
  const {
    userName,
    passWord
  } = params;
  return userName && passWord ? false : true;
}